home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / archives / com / internet / stik / gls002b5.zoo / debug.c < prev    next >
C/C++ Source or Header  |  1997-09-21  |  5KB  |  267 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <support.h>
  4. #include <string.h>
  5. #include <osbind.h>
  6. #include <mintbind.h>
  7. #include <stdarg.h>
  8. #include <unistd.h>
  9. #define DAEMON        /* to get "int caller_pid, " */
  10. #include "global.h"
  11. #include "pipe.h"
  12.  
  13. #ifdef DEBUG
  14.  
  15. #define SYSVAR_bootdev    (*((short *)0x446UL))
  16.  
  17. extern char cfg_filename[160];    /* Used to build debug log filename */
  18. static char DEBUG_LOG[160];
  19. static char DEBUG_OLD[160];
  20.  
  21. static char *op_names[OP_MAX+1] = {
  22.   NULL,
  23.   "OP_TCP_OPEN",
  24.   "OP_TCP_CLOSE",
  25.   "OP_TCP_SEND",
  26.   "OP_TCP_WAIT_STATE",
  27.   "OP_UDP_OPEN",
  28.   "OP_UDP_CLOSE",
  29.   "OP_UDP_SEND",
  30.   "OP_CNBYTE_COUNT",
  31.   "OP_CNGET_CHAR",
  32.   "OP_CNGET_NDB",
  33.   "OP_CNGET_BLOCK",
  34.   "OP_RESOLVE",
  35.   "OP_CNGETINFO",
  36.   "OP_KRMALLOC",
  37.   "OP_KRFREE",
  38.   "OP_KRGETFREE",
  39.   "OP_KRREALLOC",
  40.   "OP_GETVSTR",
  41.   "OP_SETVSTR",
  42. };
  43.  
  44. static char *prologs[] = {
  45.   "",        /* DBG_NOMSG */
  46.   "): FATAL: ",    /* DBG_FATAL */
  47.   "): ERROR: ",    /* DBG_ERROR */
  48.   "): ",    /* DBG_SYSCALL */
  49.   "): TRACE: ",    /* DBG_TRACE */
  50. };
  51.  
  52. typedef char *charp;
  53. typedef void *voidp;
  54.  
  55. int debug_level = 0;
  56.  
  57.  
  58. static int get_bootdrive(void)
  59. {
  60.   return (int)SYSVAR_bootdev;
  61. }
  62.  
  63. static char *get_procname(int pid)
  64. {
  65.   static char buf[FILENAME_MAX + 5];
  66.   static char oops[] = "<<???>>";
  67.   long h = 0, i;
  68.   char *s;
  69.  
  70.   h = Dopendir("U:\\PROC\\", 0);
  71.   if (h < 0) return oops;
  72.  
  73.   while ((i = Dreaddir(sizeof(buf), h, buf)) == 0) {
  74.     s = strchr(buf + 4, '.');
  75.     if (!s) continue;
  76.     if (atoi(s+1) != pid) continue;
  77.     *s = '\0'; break;    /* found our process */
  78.   }
  79.   Dclosedir(h);
  80.  
  81.   return (i == 0 ? buf+4 : oops);
  82. }
  83.  
  84.  
  85. int init_debug()
  86. {
  87.   register char *s = do_getvstr(Pgetpid(), GS_TRACE);
  88.   long l;
  89.  
  90.   debug_level = atoi(s);
  91.   if (debug_level < DBG_NOMSG || debug_level > DBG_TRACE) {
  92.     Cconws("Debug level out of range; defaulting to zero\r\n");
  93.     debug_level = 0;
  94.   }
  95.  
  96.   /* Put the trace log in the same directory as the config file. */
  97.   strcpy(DEBUG_LOG, cfg_filename);
  98.   s = strrchr(DEBUG_LOG, '\\');
  99.   if (!s) {
  100.     Cconws("No path specified for config file\r\n");
  101.     return 0;
  102.   }
  103.   s[1] = '\0';
  104.   strcpy(DEBUG_OLD, DEBUG_LOG);
  105.   strcat(DEBUG_LOG, "GLUESTIK.LOG");
  106.   strcat(DEBUG_OLD, "GLUESTIK.OLD");
  107.  
  108.   Fdelete(DEBUG_OLD);
  109.   Frename(0, DEBUG_LOG, DEBUG_OLD);
  110.   l = Fcreate(DEBUG_LOG, 0);
  111.   if (l < 0) {
  112.     Cconws("Unable to create trace log ");
  113.     Cconws(DEBUG_LOG);
  114.     Cconws("\r\n");
  115.     return 0;
  116.   }
  117.   Fclose((int)(short)l);
  118.  
  119.   if (Psem_create(DEBUG_SEM) < 0) {
  120.     Cconws("Unable to create trace log semaphore\r\n");
  121.     return 0;
  122.   }
  123.   Psem_release(DEBUG_SEM);
  124.  
  125.   return 1;
  126. }
  127.  
  128.  
  129. void log_entry(int pid, int lev, const char *fmt, ...)
  130. {
  131.   va_list ap;
  132.   char line[256];
  133.   register const char *s;
  134.   register char *t;
  135.   char *u;
  136.   void *v;
  137.   char buf[20];
  138.   long l;
  139.   unsigned long ul;
  140.   int fd;
  141.  
  142.   if (lev > debug_level)
  143.     return;
  144.  
  145.   strcpy(line, "pid ");
  146.   _itoa(pid, line+4, 10);
  147.   strcat(line, " (");
  148.   strcat(line, get_procname(pid));
  149.   strcat(line, prologs[lev]);
  150.  
  151.   va_start(ap, fmt);
  152.   for (s = fmt, t = line+strlen(line); *s; s++) {
  153.     if (*s != '%') {
  154.       *t++ = *s;
  155.       continue;
  156.     }
  157.  
  158.     switch (*++s) {
  159.       case '%':
  160.     *t++ = '%';
  161.     break;
  162.       case 's':
  163.     u = va_arg(ap, charp);
  164.     strcpy(t, u);
  165.     t += strlen(t);
  166.     break;
  167.       case 'S':
  168.     l = (long)va_arg(ap, int);
  169.     u = va_arg(ap, charp);
  170.     strncpy(t, u, l);
  171.     t += l;
  172.     break;
  173.       case 'i':
  174.       case 'd':
  175.     l = (long)va_arg(ap, int);
  176.     _ltoa(l, t, 10);
  177.     t += strlen(t);
  178.     break;
  179.       case 'x':
  180.     *t++ = '0'; *t++ = 'x';
  181.     l = (long)va_arg(ap, unsigned int);
  182.     _ltoa(l, t, 16);
  183.     t += strlen(t);
  184.     break;
  185.       case 'l':
  186.     l = va_arg(ap, long);
  187.     _ltoa(l, t, 10);
  188.     t += strlen(t);
  189.     break;
  190.       case 'X':
  191.     *t++ = '0'; *t++ = 'x';
  192.     ul = va_arg(ap, unsigned long);
  193.     _ultoa(ul, t, 16);
  194.     t += strlen(t);
  195.     break;
  196.       case 'p':
  197.     *t++ = '0'; *t++ = 'x';
  198.     v = va_arg(ap, voidp);
  199.     _ultoa((unsigned long)v, t, 16);
  200.     t += strlen(t);
  201.     break;
  202.       case 'c':
  203.     *t++ = va_arg(ap, int);
  204.     break;
  205.       case 'O':
  206.     l = (long)va_arg(ap, int);
  207.     _ltoa(l, buf, 10);
  208.     if (l <= 0 || l > OP_MAX) {
  209.       strcpy(t, "<<op ");
  210.       _ltoa(l, t+5, 10);
  211.       strcat(t, "?>>");
  212.       t += strlen(t);
  213.     } else {
  214.       _ltoa(l, t, 10);
  215.       strcat(t, " (");
  216.       strcat(t, op_names[l]);
  217.       strcat(t, ")");
  218.       t += strlen(t);
  219.     }
  220.     break;
  221.       case 'A':
  222.     ul = va_arg(ap, unsigned long);
  223.     _ultoa((unsigned long)(ul>>24), t, 10);
  224.     t += strlen(t); *t++ = '.';
  225.     _ultoa((unsigned long)((ul>>16)&0xFF), t, 10);
  226.     t += strlen(t); *t++ = '.';
  227.     _ultoa((unsigned long)((ul>>8)&0xFF), t, 10);
  228.     t += strlen(t); *t++ = '.';
  229.     _ultoa((unsigned long)(ul&0xFF), t, 10);
  230.     t += strlen(t);
  231.     break;
  232.       default:
  233.     strcpy(t, "<<<");
  234.     t[3] = *s;
  235.     strcpy(t+4, ">>>");
  236.     t += 7;
  237.     break;
  238.     }
  239.   }
  240.   *t++ = '\r'; *t++ = '\n'; *t = '\0';
  241.   va_end(ap);
  242.  
  243.   Psem_obtain(DEBUG_SEM);
  244.  
  245.   l = Fopen(DEBUG_LOG, 2);
  246.   if (l < 0) {
  247.     Cconws("Unable to open debug log ");
  248.     Cconws(DEBUG_LOG);
  249.     Cconws("\r\n");
  250.   } else {
  251.     fd = (int)(short)l;
  252.     Fseek(0L, fd, SEEK_END);
  253.     Fwrite(fd, strlen(line), line);
  254.     Fclose(fd);
  255.   }
  256.  
  257.   Psem_release(DEBUG_SEM);
  258. }
  259.  
  260. void cleanup_debug()
  261. {
  262.   Psem_obtain(DEBUG_SEM);
  263.   Psem_destroy(DEBUG_SEM);
  264. }
  265.  
  266. #endif /* DEBUG */
  267.